package intfns
import (
"encoding/xml"
"fmt"
"github.com/ChrisTrenkamp/goxpath/tree"
)
func last(c tree .Ctx , args ...tree .Result ) (tree .Result , error ) {
return tree .Num (c .Size ), nil
}
func position(c tree .Ctx , args ...tree .Result ) (tree .Result , error ) {
return tree .Num (c .Pos ), nil
}
func count(c tree .Ctx , args ...tree .Result ) (tree .Result , error ) {
n , ok := args [0 ].(tree .NodeSet )
if !ok {
return nil , fmt .Errorf ("Cannot convert object to a node-set" )
}
return tree .Num (len (n )), nil
}
func localName(c tree .Ctx , args ...tree .Result ) (tree .Result , error ) {
var n tree .NodeSet
ok := true
if len (args ) == 1 {
n , ok = args [0 ].(tree .NodeSet )
} else {
n = c .NodeSet
}
if !ok {
return nil , fmt .Errorf ("Cannot convert object to a node-set" )
}
ret := ""
if len (n ) == 0 {
return tree .String (ret ), nil
}
node := n [0 ]
tok := node .GetToken ()
switch node .GetNodeType () {
case tree .NtElem :
ret = tok .(xml .StartElement ).Name .Local
case tree .NtAttr :
ret = tok .(xml .Attr ).Name .Local
case tree .NtPi :
ret = tok .(xml .ProcInst ).Target
}
return tree .String (ret ), nil
}
func namespaceURI(c tree .Ctx , args ...tree .Result ) (tree .Result , error ) {
var n tree .NodeSet
ok := true
if len (args ) == 1 {
n , ok = args [0 ].(tree .NodeSet )
} else {
n = c .NodeSet
}
if !ok {
return nil , fmt .Errorf ("Cannot convert object to a node-set" )
}
ret := ""
if len (n ) == 0 {
return tree .String (ret ), nil
}
node := n [0 ]
tok := node .GetToken ()
switch node .GetNodeType () {
case tree .NtElem :
ret = tok .(xml .StartElement ).Name .Space
case tree .NtAttr :
ret = tok .(xml .Attr ).Name .Space
}
return tree .String (ret ), nil
}
func name(c tree .Ctx , args ...tree .Result ) (tree .Result , error ) {
var n tree .NodeSet
ok := true
if len (args ) == 1 {
n , ok = args [0 ].(tree .NodeSet )
} else {
n = c .NodeSet
}
if !ok {
return nil , fmt .Errorf ("Cannot convert object to a node-set" )
}
ret := ""
if len (n ) == 0 {
return tree .String (ret ), nil
}
node := n [0 ]
switch node .GetNodeType () {
case tree .NtElem :
t := node .GetToken ().(xml .StartElement )
space := ""
if t .Name .Space != "" {
space = fmt .Sprintf ("{%s}" , t .Name .Space )
}
ret = fmt .Sprintf ("%s%s" , space , t .Name .Local )
case tree .NtAttr :
t := node .GetToken ().(xml .Attr )
space := ""
if t .Name .Space != "" {
space = fmt .Sprintf ("{%s}" , t .Name .Space )
}
ret = fmt .Sprintf ("%s%s" , space , t .Name .Local )
case tree .NtPi :
ret = fmt .Sprintf ("%s" , node .GetToken ().(xml .ProcInst ).Target )
}
return tree .String (ret ), nil
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .